package Calculadora;

import Calculadora.Stack.StackList.DoublyLinkedList;
import Calculadora.Stack.StackList.SinglyLinkedList;
import Calculadora.Stack.StackList.CircularList;
import Calculadora.Stack.StackVector;
import Calculadora.Stack.StackArrayList;
import Calculadora.Stack.Stack;

/**
 * Se emplean los patrones de diseño Factory y Singlenton para crear una única 
 * calculadora.
 * @param <E>  clase generica
 * @author Vinicio Gomez
 * @since 12/08/2012
 * @version 1.0
 */
public class StackSingletonFactory <E>{
    /**La calculadora unica*/
    private Stack stack;
    /**Constante para el parametro entry de getStack para instanciar implementando ArrayList*/
    public final String ARRAYLIST = "AL";
    /**Constante para el parametro entry de getStack para instanciar implementando Vector*/
    public final String VECTOR = "VE";
    /**Constante para el parametro entry de getStack para instanciar implementando Single Linked List*/
    public final String SINGLELINKEDLIST = "SL";
    /**Constante para el parametro entry de getStack para instanciar implementando Double Linked List*/
    public final String DOUBLYLINKEDLIST = "DL";
    /**Constante para el parametro entry de getStack para instanciar implementando Circular Linked List*/
    public final String CIRCULARLIST = "CL";
    /**
     * Crea instancia unica de la calculadora y su stack
     * @param entry selecciona la implementacion por medio de la Factory
     *              AL: ArrayList
     *              VE: Vector
     *              SL: SingleLinkedList
     *              DL: DoubleLinkedList
     *              CL: CircularList
     * @return la unica instancia de la calculadora y el stack (singleton)
     */
    public Stack<E> getStack(String entry){
        //SINGLETON
        if (this.stack == null){//si no hay ninguna instancia
            //FACTORY
            if (entry.equals("AL")){
                stack = new StackArrayList<E>();
            }
            if (entry.equals("VE")){
                stack = new StackVector<E>();
            }
            if (entry.equals("SL")){
                stack = new SinglyLinkedList<E>();
            }
            if (entry.equals("DL")){
                stack = new DoublyLinkedList<E>();
            }
            if (entry.equals("CL")){
                stack = new CircularList<E>();
            }
        }
        return stack;//la instacia actual
    }
}